(ns controllers.slika
    (:use  [controllers.misc]
           [clojure.java.io]
           [clojure.core]
        )
  (:import [java.awt Color] 
           [java.awt.image BufferedImage]
           [java.io File IOException]
           [javax.imageio ImageIO]
           [javax.swing JOptionPane ImageIcon]
           [java.lang Math ]
           )  
  )

(defn red-filter [boja nul-o]
    (pixel (crvena-komponenta boja) 0 0 )   
  )
(defn blue-filter [boja nul-o]
    (pixel 0 0 (plava-komponenta boja))   
  )

(defn green-filter [boja nul-o]
    (pixel 0 (zelena-komponenta boja) 0)   
  )


(defn invert-filter
  [boja]
  
  (pixel
    (- 255 (og (crvena-komponenta boja) 255))
    (- 255 (og (zelena-komponenta boja) 255))
    (- 255 (og (plava-komponenta boja) 255))
    )
  
  )



(defn cont-pom2 
  ;-100 do 100 vrednost c
  [b c]
  (
   let [koef 
			  (* (+ (* (- (/ b 255.0) 0.5) (rem c 101)) 0.5)  255.0)   
			  ]
   (int (og  koef 256)) ; 1-255
   
   )
  )

(defn cont-pom 
  [boja c]
  
       (pixel
        (cont-pom2 (crvena-komponenta boja) c)
        (cont-pom2 (zelena-komponenta boja) c) 
        (cont-pom2 (plava-komponenta boja) c) )
      
  )


(defn vrati-broj [broj]
  (let [a (re-find #"\d+" broj)]
    
   (if (= a nil) nil (read-string a)
    )
  
  )
  )


(defn contrast-filter 
  [boja & c]
  ;(def c 50)
  ;(prn c);rem col 101 
  ;contrast 50
  (let [a (/ (+ 100 (vrati-broj (str c))) 100.0)        
       contrast (* a a)]
    (cont-pom boja contrast)
    )
  )


(defn gray-scale-filter
  [boja & c]
  (
    let [
         deo  
          (+ 
            (* (crvena-komponenta boja ) 0.299)
            (* (zelena-komponenta boja ) 0.587)
            (* (plava-komponenta boja ) 0.114)
            )
          ]
    
    (pixel (long deo) (long deo) (long deo))
    
    )
  )

(defn brightness-filter
  [boja & c]
  ;(def c 180)
  ;trenutno vrednost 180
  ;brightness [-255,255]; rem brigth 256
  (let [cr (og (+ (crvena-komponenta boja ) (vrati-broj (str c))) 255)
        cz (og (+ (zelena-komponenta boja ) (vrati-broj (str c))) 255)
        cp (og (+ (plava-komponenta boja ) (vrati-broj (str c))) 255)
             ]
    
    (pixel cr cz cp)
    )
  )

(defn upisi-u-fajl
  [putanja sadrzaj]  
  
    (ImageIO/write sadrzaj "jpg" (clojure.java.io/file putanja  ))
   (clojure.string/replace putanja #"./public" "")
   ;putanja
  )


(defn prikaz-slike
   "Uzlima sliku koja se nalazi na lokaciji[putanja] , primenjuje jedan od filtera i prikazuje je"
  
  [filter putanja & par] ;filter
  (prn par)
  (try (
          let[p putanja];"./public/images-u/slika.jpg"
             
          (def z 
            (ImageIO/read (File. p)) 
           )
         (let [image  (BufferedImage. (.getWidth z) (.getHeight z) BufferedImage/TYPE_INT_RGB)]
           
           (doseq [x (range (.getWidth z))
	                y (range (.getHeight z))]
           
                      (.setRGB image                        
                        x y 
                        (
                          ;treba raditi sanitize filtera
                          
                            (eval (read-string (str "controllers.slika/" filter))) 
                            (.getRGB z x y)                          
                            (if-not (= (vrati-broj (str par)) nil) 
                              (int  (vrati-broj (str par)))
                              nil)
                          

                          )
                      )             
            )          
          (upisi-u-fajl putanja image)
          )      
    )
    (catch Exception e (prn (.printStackTrace e) )); (str "opet je zeznuo")    
    )  
  )

